import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * 流的四种构建形式
 */
public class StreamConstructor {
    /**
     * 1. 由数值直接构建流
     */
    public static void streamFromValue() {
        Stream stream = Stream.of(1, 2, 3, 4, 5);
        stream.forEach(System.out::println);
    }

    /**
     * 通过数组构建流
     */
    public static void streamFromArray() {
        int[] numbers = {1, 2, 3, 4, 5};
        IntStream stream = Arrays.stream(numbers);
        stream.forEach(System.out::println);
    }

    /**
     * 通过文件生成流
     *
     * @throws IOException
     */
    public static void streamFromFile() throws IOException {
        // 读取当前文件
        Stream<String> stream = Files.lines(Paths.get("StreamConstructor.java"));
        stream.forEach(System.out::println);
    }

    /**
     * 通过函数方式生成流（无限流，可以通过limit限制个数）
     * 使用Stream迭代器
     */
    public static void streamFromFunction() {
        // 下一个元素基于上一个元素
        // 第一次的n取值seed，以后每次的n都取值上次的结果
        Stream stream = Stream.iterate(10000, n -> n + 2);
        stream.limit(5).forEach(System.out::println);
    }

    /**
     * 通过函数方式生成流（无限流，可以通过limit限制个数）
     * 使用Stream生成器
     */
    public static void streamFromFunction2() {
        // 使用Math::random生成随机数
        Stream stream = Stream.generate(Math::random);
        stream.limit(5).forEach(System.out::println);
    }

    public static void main(String[] args) throws IOException {
        streamFromValue();
        streamFromArray();
        streamFromFile();
        streamFromFunction();
        streamFromFunction2();
    }
}
